#pragma once
#ifndef SCNET_SERVER_HPP
#define SCNET_SERVER_HPP

#include "../include/scNet/Core.hpp"
#include "../include/scNet/SocketWrapper.hpp"

#include <functional>
#include <atomic>

namespace scNet {
	class Server : public ServerCore {
	private: 
		std::unique_ptr<SocketWrapper> socket_;
		std::atomic<bool> running_{false};
		std::function<std::string(const std::string&)> request_handler_;

	public:
		// 构造 初始化Server对象
		Server();

		~Server() override;

		// 继承来自ServerCore的接口
		// 启动服务器 指定端口号
		void start(uint16_t port)	override;

		// 停止服务器
		void stop() override;

		// 设置请求处理函数 用于处理接受到的请求
		void setRequestHandler(std::function<std::string(const std::string&)> handler)		override;
		
		// 设置连接处理函数，用于处理客户端连接
    	void setConnectionHandler(std::function<void(int)> handler);
		
    	// 设置错误处理函数，用于处理服务器错误
    	void setErrorHandler(std::function<void(const std::string&)> handler);
	private:
		// 接受客户端连接
		void acceptConnections();

		// 处理 客户端 的通信
		void handleClient(int client_fd);

		// 连接处理函数：当有客户端连接时调用
    	std::function<void(int)> connection_handler_;

		// 错误处理函数：当发生错误时调用
    	std::function<void(const std::string&)> error_handler_;
	};
}

#endif